<?php

if(!defined("VL_LEGAL")) die();

/**
 * Класс пользователя.
 * @author vladimmi <vladimmi@ya.ru>
 */
class vlUser
{
	/**
	 * Информация о пользователе
	 * @var mixed
	 */
	var $info;
	
	/**
	 * Логин
	 * @var string
	 */
	var $login;
	
	/**
	 * Права пользователя
	 * @var mixed 
	 */
	private $permissions;
	
	/**
	 * Получена ли информация о пользователе по паре логин-пароль
	 * @var bool
	 */
	private $isLogged;
	
	/**
	 * Идентификаторы групп, к которым относится пользователь
	 * @var mixed
	 */
	private $groupIds;
	
	/**
	 * Конструктор
	 * @param int $id Идентификатор пользователя
	 * @return vlUser
	 */
	function vlUser($id=false)
	{
		$this->permissions=array();
		if($id) $this->getById($id);
		$this->isLogged=false;
	}
	
	/**
	 * Получить информацию о пользователе по его идентификатору
	 * @param int $id Идентификатор пользователя
	 * @return bool Результат загрузки информации о пользователе
	 */
	function getById($id)
	{
		$this->info=false;
		$API=&vlAPI::getInstance();
		$query="SELECT * FROM ".VL_TABLE_USERS." WHERE u_id='".$id."'";
		$result=$API->db[VL_DBROLE_USERS]->query($query);
		if($API->db[VL_DBROLE_USERS]->numRows($result)) {
			$inf=$API->db[VL_DBROLE_USERS]->fetchAssoc($result);
			$this->login=$inf["login"];
			$this->info=json_decode($inf["info"], true);
			$this->permissions=explode(",", $inf["permissions"]);
			$this->groupIds=explode(",", $this->info["ugrp_id"]);
			return true;
		} else return false;
	}
	
	/**
	 * Получить информацию о пользователе по его логину
	 * @param string $login Логин пользователя
	 * @return bool Результат загрузки информации о пользователе
	 */
	function getByLogin($login)
	{
		$this->info=false;
		$API=&vlAPI::getInstance();
		$query="SELECT * FROM ".VL_TABLE_USERS." WHERE login='".$login."'";
		$result=$API->db[VL_DBROLE_USERS]->query($query);
		if($API->db[VL_DBROLE_USERS]->numRows($result)) {
			$inf=$API->db[VL_DBROLE_USERS]->fetchAssoc($result);
			$this->login=$inf["login"];
			$this->info=json_decode($inf["info"], true);
			$this->permissions=explode(",", $inf["permissions"]);
			$this->groupIds=explode(",", $this->info["ugrp_id"]);
			return true;
		} else return false;
	}
	
	/**
	 * Получить информацию о пользователе по паре логин-пароль
	 * @param string $login Логин пользователя
	 * @param string $password Пароль
	 * @return bool Результат загрузки информации о пользователе
	 */
	function login($login, $password)
	{
		$this->info=false;
		$API=&vlAPI::getInstance();
		$API->debug->group("Авторизация пользователя");
		$API->debug->dump("Логин", $login);
		$API->debug->dump("Пароль", $password);
		$query="SELECT * FROM ".VL_TABLE_USERS." WHERE login='".$login."' AND pass='".md5($password)."'";
		$result=$API->db[VL_DBROLE_USERS]->query($query);
		if($API->db[VL_DBROLE_USERS]->numRows($result)) {
			$API->debug->log("OK");
			$inf=$API->db[VL_DBROLE_USERS]->fetchAssoc($result);
			$this->login=$inf["login"];
			$this->info=json_decode($inf["info"], true);
			$this->permissions=explode(",", $inf["permissions"]);
			$this->groupIds=explode(",", $inf["ugrp_id"]);
			$this->calcPermissions();
			$this->isLogged=true;
			return true;
		} else {
			$API->debug->warn("Ошибка");
			return false;
		}
	}
	
	/**
	 * Рассчитать окончательные права пользователя
	 * @return void
	 */
	private function calcPermissions()
	{
		$API=&vlAPI::getInstance();
		$tmp=array();
		$minus=array();
		foreach($this->groupIds as $ugrp_id) {
			$grp=new vlUserGroup($ugrp_id);
			$tmp=array_merge($tmp, $grp->info["permissions"]);
		}
		foreach($this->permissions as $p) {
			if($p=="overall") $tmp=array_merge($tmp, $API->permissions->getShortList());
			elseif($p[0]=="-") $minus[]=substr($p, 1, strlen($p)-1);
			else $tmp[]=$p;
		}
		$tmp=array_diff($tmp, $minus);
		$this->permissions=$tmp;
		$API->debug->dump("Вычисленные права пользователя '".$this->login."'", $tmp);
	}
	
	/**
	 * Получена ли информация о пользователе по паре логин-пароль
	 * @return bool
	 */
	function isLoggedIn()
	{
		return $this->isLogged;
	}
	
	/**
	 * Имеет ли пользователь указанное право доступа
	 * @param string $p_id Идентификатор права
	 * @return bool
	 */
	function hasPermission($p_id)
	{
		return in_array($p_id, $this->permissions);
	}
}

?>